package hit.edu.zjc.DataIntegration;

import hit.edu.zjc.Tool.DataBaseTool;
import java.util.*;
import java.sql.*;
public class DBConInfo 
{
	public String dbip;
	public String dbport;
	public String dbname;
	public String username;
	public String password;
	public int dbtype;//MySql MSSql
	
	protected static DBConInfo[] dbci_array=null;
	public static final int TYPE_MYSQL=1000;
	public static final int TYPE_MSSQL=1001;
	public static String TableName;//数据库表名
	public static ResultSetMetaData rsmd;
	public static int[] Primary_Key;//列号是从1开始的。主键列号是位加入新列之前的。
	
	
	/*
	 * 验证数据库是否可连接
	 * 验证每个数据库的表是否同构（相同列数，每列数据类型相同）。
	 * 在完成调用后，需要调用UserDef相关函数，获取用户设定，实现异常值检测的目的。
	 * */
	public static boolean validateDBTable()
	{
		try
		{
			//DBConInfo[] dbci_array=DBConInfo.GetConInfo();
			if(dbci_array==null||dbci_array[0]==null)
				return false;
			DataBaseTool dbt=new DataBaseTool(dbci_array[0]);
			ResultSet rs_first=dbt.exesql("select * from "+DBConInfo.TableName);
			ResultSetMetaData rsmd_first=rs_first.getMetaData();
			int colnum=rsmd_first.getColumnCount();//获得列数
			for(int i=1;i<dbci_array.length;i++)
			{
				DataBaseTool dbt_next=new DataBaseTool(dbci_array[i]);
				ResultSet rs_next=dbt_next.exesql("select * from "+DBConInfo.TableName);
				ResultSetMetaData rsmd_next=rs_next.getMetaData();
				int colnum_next=rsmd_next.getColumnCount();
				if(colnum!=colnum_next)//验证数据表列数是否相同
				{
					System.out.println("databases has different cols.");
					return false;
				}
				for(int j=1;j<=colnum;j++)//验证数据表到数据类型是否相同
				{
					if(!rsmd_first.getColumnClassName(j).equals(rsmd_next.getColumnClassName(j)))
					{
						System.out.println("databases' table has different types");
						return false;
					}
				}
			}
			rsmd=rsmd_first;//初始化DBConInfo中的rsmd
			//获取表中主键的列号
			ResultSet pkrs=dbt.con.getMetaData().getPrimaryKeys(null, null, TableName.toUpperCase());
			ArrayList<Integer> pk=new ArrayList<Integer>();
			while(pkrs.next())
			{
				for(int i=1;i<=colnum;i++)
				{
					if(pkrs.getString(4).trim().equals(rsmd.getColumnName(i).trim()))
					{
						pk.add(i);
						break;
					}
				}
			}
			Primary_Key=new int[pk.size()];
			for(int i=0;i<pk.size();i++)
				Primary_Key[i]=pk.get(i);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	
	
	
	public static DBConInfo[] GetConInfo()
	{
		if(dbci_array==null||dbci_array.length==0)
		{
			GetAllInfo();
		}
		return dbci_array;
	}
	protected static void GetAllInfo()
	{
		//获得用户给出的数据库连接信息
				//暂不实现
				//Test Code
		//*
		TableName="photo_inf";
		dbci_array=new DBConInfo[2];
		dbci_array[0]=new DBConInfo();
		dbci_array[1]=new DBConInfo();
		dbci_array[0].dbip="192.168.59.1";
		dbci_array[0].dbport="3306";
		dbci_array[0].dbname="mydb";
		dbci_array[0].dbtype=TYPE_MYSQL;
		dbci_array[0].username="root";
		dbci_array[0].password="zhangxu";
		
		dbci_array[1].dbip="219.217.227.75";
		dbci_array[1].dbport="3306";
		dbci_array[1].dbname="mydb";
		dbci_array[1].dbtype=TYPE_MYSQL;
		dbci_array[1].username="root";
		dbci_array[1].password="zhangjiacheng";
		//*/
		
		/*
		TableName="photo_inf";
		dbci_array=new DBConInfo[1];
		dbci_array[0]=new DBConInfo();
		dbci_array[0].dbip="192.168.59.1";
		dbci_array[0].dbport="3306";
		dbci_array[0].dbname="mydb";
		dbci_array[0].dbtype=TYPE_MYSQL;
		dbci_array[0].username="root";
		dbci_array[0].password="zhangxu";
		//*/
		
		
		
		boolean res=validateDBTable();
		if(false)
		{
			dbci_array=null;
		//数据库表有问题，给出提示：
			System.out.println("Wrong DataBase Table!");
			System.exit(0);
		}
		
	}
}
